/*
* Copyright (c) 2025 Shenzhen Kaihong Digital Industry Development Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/**
 * @file ROS msg grammar for tree-sitter
 * @author litao <litao@kaihong.com>
 */

/// <reference types="tree-sitter-cli/dsl" />
// @ts-check

module.exports = grammar({
  name: "rosmsg",

  rules: {
    document: $ => repeat(choice(
      $.definition,
      $.constant,
      $.comment,
    )),
    definition: $ => seq(field("fieldtype", $.fieldtype), field("fieldname", $.identifier)),
    constant: $ => seq(
      field("constanttype", $.identifier),
      field("constantname", $.identifier),
      "=",
      field("constantvalue", token(/[^#\n]*/)),
    ),
    comment: $ => token(seq("#", /.*/)),
    fieldtype: $ => choice(
      $.basetype,
      $.arraytype,
    ),
    basetype: $ => seq(
      optional(seq(field("pkgname", $.identifier), "/")),
      field("msgname", $.identifier)
    ),
    arraytype: $ => seq(field("basetype", $.basetype), "[", optional(field("arraysize", $.arraysize)), "]"),
    arraysize: $ => token(/[0-9]+/),
    identifier: $ => token(/[a-zA-Z_][a-zA-Z0-9_]*/),
  },

  conflicts: $ => [
    [$.basetype, $.constant],
  ],
});
